package com.omuao.common.utils.verification;

import com.omuao.common.exception.MessageCodeException;

import java.util.Date;

/**
 * 验证工具类
 *
 * @author yumi@omuao.com
 * @since 2019-10-15
 **/
public interface Verification<T, E extends Exception> {

    /**
     * 设置验证错误消息
     *
     * @param message 验证错误消息
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification message(String message) throws E;

    /**
     * 即时返回异常
     *
     * @param flag 标志 true 开启，false 关闭
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification immediateException(boolean flag) throws E;

    /**
     * 返回验证结果
     *
     * @return true 验证通过 false 验证失败
     * @throws E 消息代码异常
     */
    boolean result() throws E;

    /**
     * 设置数据源 日期格式
     *
     * @return 消息代码异常
     * @throws E 消息代码异常
     */
    Verification pattern(String pattern) throws E;

    /**
     * 设置目标源 日期格式
     *
     * @return 消息代码异常
     * @throws E 消息代码异常
     */
    Verification comparePattern(String pattern) throws E;

    /**
     * 设置源数据
     *
     * @param source 数据
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> source(T source) throws E;


    /**
     * 验证数据源是否为空
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> notNull() throws E;

    /**
     * 验证数据源是否为空集
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isEmpty() throws E;

    /**
     * 验证数据源是否为数字
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isNum() throws E;

    /**
     * 验证数据源是否为Double类型
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isDouble() throws E;

    /**
     * 验证数据源是否为Integer类型
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isInteger() throws E;

    /**
     * 验证数据源是否为Long类型
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isLong() throws E;

    /**
     * 验证数据源是否为Short类型
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isShort() throws E;

    /**
     * 验证数据源是否为Byte类型
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isByte() throws E;

    /**
     * 验证数据源是否为Float类型
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isFloat() throws E;

    /**
     * 验证数据源是否为Character类型
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isCharacter() throws E;

    /**
     * 验证数据源是否为Boolean类型
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isBoolean() throws E;

    /**
     * 验证数据源是否为Null空对象
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isNull() throws E;

    /**
     * 验证数据源是否为String字符串
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isString() throws E;

    /**
     * 验证数据源是否为String空串
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isEmptyString() throws E;

    /**
     * 验证数据源是否为String空串 去空格
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isEmptyStringWithTrim() throws E;

    /**
     * 验证数据源是否为数组
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isArray() throws E;

    /**
     * 验证数据源是否为空数组
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isArrayEmpty() throws E;

    /**
     * 验证数据源是否为List
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isList() throws E;

    /**
     * 验证数据源是否为Map
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isMap() throws E;

    /**
     * 验证数据源是否为Set
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isSet() throws E;

    /**
     * 验证数据源是否为集合
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isCollection() throws E;

    /**
     * 验证数据源是否为类
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isClass() throws E;

    /**
     * 验证数据源是否为目标类
     *
     * @param dest 目标类
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isDestClass(Class dest) throws E;

    /**
     * 验证数据源是否为基础类型
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isPrimaryClass() throws E;

    /**
     * 验证数据源是否为接口
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isInterface() throws E;

    /**
     * 验证数据源是否为接口实现类
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isDestSubInterface(Class dest) throws E;

    /**
     * 验证数据源是否为日期
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    Verification<T, E> isDate() throws E;

    /**
     * 验证数据源和比较数据是否相等
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    <Compare> Verification<T, E> eq(Compare compare) throws E;


    /**
     * 验证数据源 大于(>) 目标源
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    <Compare> Verification<T, E> gt(Compare compare) throws E;

    /**
     * 验证数据源 小于(<) 目标源
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    <Compare> Verification<T, E> lt(Compare compare) throws E;


    /**
     * 验证数据源是否存在目标源集中
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    <Compare> Verification<T, E> exist(Compare compare) throws E;


    /**
     * 验证数据源是否不存在目标源集中
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    <Compare> Verification<T, E> notExist(Compare compare) throws E;

    /**
     * 验证数据日期在比较日期之前
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    <Compare extends Date> Verification<T, E> dateBefore(Compare compare) throws E;


    /**
     * 验证数据日期在比较日期之后
     *
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    <Compare extends Date> Verification<T, E> dateAfter(Compare compare) throws E;


    /**
     * 判断日期是否存在数据日期，目标日期之间
     *
     * @param date 日期
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    <Compare extends Date> Verification<T, E> dateRange(Compare compare, Date date) throws E;

    /**
     * 判断日期是否存在数据日期，目标日期之外
     *
     * @param date 日期
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    <Compare extends Date> Verification<T, E> dateNotRange(Compare compare, Date date) throws E;

    /**
     * 判断某个日期在offset后 是否存在数据日期，目标日期之间
     *
     * @param date   日期
     * @param offset 偏移
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    <Compare extends Date> Verification<T, E> dateRange(Compare compare, Date date, int offset) throws E;

    /**
     * 判断某个日期在offset后 是否不存在数据日期，目标日期之间
     *
     * @param date   日期
     * @param offset 偏移
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    <Compare extends Date> Verification<T, E> dateNotRange(Compare compare, Date date, int offset) throws E;

    /**
     * 判断某个日期在offset后 是否存在数据日期，目标日期之间
     *
     * @param date   日期
     * @param offset 偏移
     * @param unit   时间单位
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    <Compare extends Date> Verification<T, E> dateRange(Compare compare, Date date, int offset, int unit) throws E;

    /**
     * 判断某个日期在offset后 是否存在数据日期，目标日期之间
     *
     * @param date   日期
     * @param offset 偏移
     * @param unit   时间单位
     * @return 验证工具类
     * @throws E 消息代码异常
     */
    <Compare extends Date> Verification<T, E> dateNotRange(Compare compare, Date date, int offset, int unit) throws E;

}
